![API Gateway Websocket を Golang でためしてみる](https://devio2023-media.developers.io/wp-content/uploads/2019/05/amazon-api-gateway.png)
API Gateway Websocket を Golang でためしてみる
タイトルの通りです。
既出かと思いますが、terraform
やaws-sdk-go-v2
を使っているので特定の人には需要あるかと思いブログ化しました。
参考にしたサイト
- aws-samples/apigateway-websockets-golang
- rtomchinsky/aws-chat
- aws-sdk-go-v2
- aws-sdk-go-v2 code example
- Amazon DynamoDB、AWS Lambda、および Go を使用してエンタープライズアプリケーションを構築する
- wscat を使用した WebSocket API への接続とメッセージの送信
GitHub
構成図
解説
ベーシックなパターンで実装しました。
いちおうクリーンアーキテクチャを意識した構成になっています。 ただ、時間がなく認可処理と細かなエラーハンドリングは実装していません。
クライアントは、connection
ルートで接続を開始し、disconnection
ルートで接続を終了します。
接続開始時には、API Gatewayより自動発行されるconnectionId
をDynamoDBへ保存します。
接続終了時には、connectionId
をDynamoDBから削除します。
接続中は、$request.body.action
の値によってルーティングを振り分けています。
下記のようなメッセージを送信すれば、send_message
にルーティングされ、対応したLambdaがキックされます。
{ "action": "send_message", "targetId": "xxxx", "message": "hello world" }
Lambda内部では、targetId
に指定した値で接続しているユーザーに対してメッセージを送信します。
動作確認
AWSへのデプロイなどはGitHubのREADMEを参考にしてください。
wscatを使って動作確認していきます。
- コマンド例
wscat -c wss://<api-id>.execute-api.<region>.amazonaws.com/<stage>
- 送信メッセージ例
{"action": "send_message", "targetId": "xxx", "message": "hello world"}
まとめ
以上どなたかの参考になれば幸いです。